Чтобы понять, как они хранятся, вы должны сначала понять, что они из себя представляют и с какими значениями они предназначены.
В отличие от целых чисел, значение с плавающей запятой предназначено для представления как чрезвычайно малых значений, так и очень больших. Для обычных 32-битных значений с плавающей точкой это соответствует значениям в диапазоне от 1.175494351 * 10 ^ -38 до 3.40282347 * 10 ^ + 38 .
Очевидно, что, используя только 32 бита, невозможно сохранить каждую цифру в таких числах.
Когда дело доходит до представления, вы можете видеть все нормальные числа с плавающей запятой в виде значений в диапазоне от 1,0 до (почти) 2,0, масштабированных со степенью двойки. Так что 1.0 это просто 1.0 * 2 ^ 0 . 2,0 1,0 * 2 ^ 1 . -5.0 это -1.25 * 2 ^ 2 .
Итак, что нужно для того, чтобы закодировать это максимально эффективно? Что нам действительно нужно?
- Знак выражения.
- Показатель степени
- Значение в диапазоне от 1,0 до (почти) 2,0. Это известно как "мантисса", то есть значение.
Это кодируется следующим образом в соответствии со стандартом IEEE-754.
- Знак - один бит.
- Показатель степени хранится в виде целого числа без знака, для 32-битных значений с плавающей запятой это поле равно 8 битам. 1 представляет наименьший показатель степени, а «все единицы - 1» наибольший. (0 и «все единицы» используются для кодирования специальных значений, см. Ниже.) Значение в середине (127, в 32-битном случае) представляет ноль, это также известно как смещение .
- Глядя на мантиссу (значение от 1,0 до (почти) 2,0), можно увидеть, что все возможные значения начинаются с «1» (как в десятичном, так и в двоичном представлении). Это означает, что нет смысла хранить его. Остальные двоичные цифры хранятся в целочисленном поле, в 32-разрядном случае это поле составляет 23 бита.
В дополнение к обычным значениям с плавающей точкой существует ряд специальных значений:
- Ноль кодируется с показателем степени и мантиссой как ноль. Знаковый бит используется для обозначения «плюс ноль» и «минус ноль». Минус ноль полезен, когда результат операции чрезвычайно мал, но все равно важно знать, из какого направления произошла операция.
- плюс и минус бесконечность - представлены с использованием показателя «все единицы» и нулевого поля мантиссы.
- Не число (NaN) - представлено с использованием показателя «все единицы» и ненулевой мантиссы.
- Денормализованные числа - числа, меньшие наименьшего нормального числа. Представлено с использованием поля нулевого показателя и ненулевой мантиссы. Особенность этих чисел заключается в том, что точность (то есть количество цифр, которое может содержать значение) будет падать по мере уменьшения значения просто потому, что в мантиссе нет места для них.
Наконец, ниже приведено несколько конкретных примеров (все значения в шестнадцатеричном формате):
- 1,0: 3f800000
- -1234.0: c49a4000
- 100000000000000000000000.0: 65a96816